/** 权限验证
 * VueRouter 中的 前置钩子函数 beforEach（to,from,next）
 * 当进行登录的时候进行判断 是否已经登录，登录可以访问登录页面，否则 回到登录页
 * to: 即将要进入的目标路由文件
 * from: 即将要离开的路由文件
 * next: 是一个方法，可以指定路由地址，进行路由跳转
 */
import router from './router/index';
import { get } from '@/utils/auth';
import { ADMIN_KEY } from '@/utils/keys';
import store from './store';
import Layout from '@/layout';

router.beforeEach((to, from, next) => {
  const whiteList = ['/login'];
  // 判断本地有无 token 有过没有 跳回到登录页面 如果有可以跳到相应页面
  const hasToken = get(ADMIN_KEY);
  if (hasToken) {
    if (to.path === '/login') {
      next({ path: '/dashboard' });
    }
    else if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      try {
        // 如果没有路由权限 获取 用户信息 和路由
        const hasRoles = store.getters.roles.length > 0;
        if (!hasRoles && hasToken) {
          store.dispatch('user/getInfo').then(() => {
            store.dispatch('permission/generateRoutes').then(accessRoutes => {
              for (let i = 0; i < accessRoutes.length; i++) {
                const route = accessRoutes[i];
                router.addRoute(route);
              }
              store.dispatch('config/setConfig')
              next({ ...to, replace: true }); // hack 方法 确保ADD完成
            })
          }).catch(err => {
            store.dispatch('user/logOut').then((res) => {
              next({ path: '/' });
            }).catch(err => {
              next({ path: '/' });
            });
          });
        }else {
          next()
        }
      }
      catch (error) {
        // 清空token 返回login界面
        store.dispatch('user/logout');
        next(`/login?redirect=${to.path}`);
      }
    }
  } else {
    // 没有查到token 跳转到登录也买你
    if (to.path !== '/login') {
      next(`/login?redirect=${to.path}`);
    } else {
      next();
    }
  }
});
